package com.nice.nice201110.config.intecept;

import com.nice.nice201110.vo.UserVo;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Component
public class LoginIntecept implements HandlerInterceptor {
    /**
     *  调用时间：Controller方法处理之前
     *
     *  执行顺序：链式Intercepter情况下，Intercepter按照声明的顺序一个接一个执行
     *
     *  若返回false，则中断执行，注意：不会进入afterCompletion
     * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //每一个项目对于登陆的实现逻辑都有所区别，我这里使用最简单的Session提取User来验证登陆。
        HttpSession session = request.getSession();
        //这里的User是登陆时放入session的
        //UserVo userVo = (UserVo) session.getAttribute("USER");
        UserVo userVo = new UserVo();
        userVo.setName("nice");
        userVo.setId("1");
        session.setAttribute("USER",userVo);
        if (userVo == null){
            //这个方法返回false表示忽略当前请求，如果一个用户调用了需要登陆才能使用的接口，如果他没有登陆这里会直接忽略掉
            //当然你可以利用response给用户返回一些提示信息，告诉他没登陆
            response.sendRedirect("/admin/index");
            return false;
        }else {
            return true;    //如果session里有user，表示该用户已经登陆，放行，用户即可继续调用自己需要的接口
        }
    }
    /**
     * 调用前提：preHandle返回true
     *
     * 调用时间：Controller方法处理完之后，DispatcherServlet进行视图的渲染之前，也就是说在这个方法中你可以对ModelAndView进行操作
     *
     * 执行顺序：链式Intercepter情况下，Intercepter按照声明的顺序倒着执行。
     *
     * 备注：postHandle虽然post打头，但post、get方法都能处理
     *
     * */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }
    /**
     * 调用前提：preHandle返回true
     *
     * 调用时间：DispatcherServlet进行视图的渲染之后
     *
     * 多用于清理资源
     * */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
